# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/16 16:56 
@Author  : ZhangShenao 
@File    : file_context_manager_by_generator.py 
@Desc    : 基于生成器实现,自定义文件的上下文管理器

使用装饰器contextlib.contextmanager,即可以基于函数,实现自定义的上下文管理器

使用类实现的上下文管理器,和使用生成器实现,二者在功能上是一致的
基于类的上下文管理器更加flexible,适用于大型的系统开发
而基于生成器的上下文管理器更加方便、简洁,适用于中小型程序

"""
import contextlib


@contextlib.contextmanager  # 使用装饰器contextlib.contextmanager实现上下文管理器
def file_context_manager(file_path: str, mode: str = 'r'):
    """文件上下文管理器"""

    try:
        # 打开文件
        f = open(file_path, mode)

        # 返回并保存文件资源
        yield f
    except Exception as err:
        # 捕获异常
        print(f'open file error: {err}')
    finally:
        # 释放文件资源
        if f is not None:
            f.close()
            print('file is closed')


if __name__ == '__main__':
    # 使用自定义上下文管理器
    with file_context_manager('c.txt', 'a') as f:
        f.write('hello\n')

    with file_context_manager('c.txt', 'a') as f:
        raise Exception('mock write exception')
